import { ActivatedRouteSnapshot, DefaultUrlSerializer, RouteReuseStrategy, DetachedRouteHandle } from '@angular/router';

// 定义存储Route状态信息的对象接口
interface RouteStorageObject {
  snapshot: ActivatedRouteSnapshot;
  handle: DetachedRouteHandle;
}

export class SimpleReuseStrategy implements RouteReuseStrategy {

  calcKey(route: ActivatedRouteSnapshot) {
    let next = route;
    let url = '';
    while(next) {

      if (next.url) {
          url = next.url.join('/');
      }
      next = next.firstChild;
    }
    return url;
  }

  // key-value 的形式存储不同的路由状态
  handlers: {[key: string]: DetachedRouteHandle} = {};

  // 模块根目录不复用
  shouldDetach(route: ActivatedRouteSnapshot): boolean {
    return true;
  }

  store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {

    if (handle) {
      this.handlers[this.calcKey(route)] = handle;
    };
  }

  shouldAttach(route: ActivatedRouteSnapshot): boolean {
    return !!route.routeConfig && !!this.handlers[this.calcKey(route)];
  }

  retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {

    if (!route.routeConfig || !this.handlers[this.calcKey(route)]) {
      return null;
    } else {
      return this.handlers[this.calcKey(route)];
    };
  }

  // 返回 true 则表示复用
  shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
    return this.calcKey(curr) === this.calcKey(future) && (JSON.stringify(future.queryParams) == JSON.stringify(curr.queryParams))
  }
}


// import { RouteReuseStrategy, DefaultUrlSerializer, ActivatedRouteSnapshot, DetachedRouteHandle } from '@angular/router';
//
// export class SimpleReuseStrategy implements RouteReuseStrategy {
//
//     public static handlers: { [key: string]: DetachedRouteHandle } = {}
//
//     /** 表示对所有路由允许复用 如果你有路由不想利用可以在这加一些业务逻辑判断 */
//     public shouldDetach(route: ActivatedRouteSnapshot): boolean {
//         return true;
//     }
//
//     /** 当路由离开时会触发。按path作为key存储路由快照&组件当前实例对象 */
//     public store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
//         SimpleReuseStrategy.handlers[route.routeConfig.path] = handle
//     }
//
//     /** 若 path 在缓存中有的都认为允许还原路由 */
//     public shouldAttach(route: ActivatedRouteSnapshot): boolean {
//         return !!route.routeConfig && !!SimpleReuseStrategy.handlers[route.routeConfig.path]
//     }
//
//     /** 从缓存中获取快照，若无则返回nul */
//     public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
//         if (!route.routeConfig) {
//             return null
//         }
//         return SimpleReuseStrategy.handlers[route.routeConfig.path]
//     }
//
//     /** 进入路由触发，判断是否同一路由 */
//     public shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
//         return future.routeConfig === curr.routeConfig
//     }
// }




// import {
//     RouteReuseStrategy,
//     ActivatedRouteSnapshot,
//     DetachedRouteHandle,
// } from '@angular/router';
//
// function routeToUrl(route: ActivatedRouteSnapshot): string {
//     if (route.url) {
//         if (route.url.length) {
//             return route.url.join('/');
//         } else {
//             if (typeof route.component === 'function') {
//                 return `[${route.component.name}]`;
//             } else if (typeof route.component === 'string') {
//                 return `[${route.component}]`;
//             } else {
//                 return `[null]`;
//             }
//         }
//     } else {
//         return '(null)';
//     }
// }

// function calcKey(route: ActivatedRouteSnapshot) {
//     let next = route;
//     let url = route.pathFromRoot.map(it => routeToUrl(it)).join('/') + '*';
//     while (next.firstChild) {
//         next = next.firstChild;
//         url += '/' + routeToUrl(next);
//     }
//     return url;
// }
//
// export class CustomReuseStrategy implements RouteReuseStrategy {
//
//     handlers: { [key: string]: DetachedRouteHandle } = {};
//
//     shouldDetach(route: ActivatedRouteSnapshot): boolean {
//         console.log('CustomReuseStrategy:shouldDetach', calcKey(route));
//         if (!route.routeConfig || route.routeConfig.loadChildren) {
//             return false;
//         } else {
//             return true;
//         }
//     }
//
//     store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
//         const key = calcKey(route);
//         console.log('CustomReuseStrategy:store', key, route, handle);
//         this.handlers[key] = handle;
//     }
//
//     shouldAttach(route: ActivatedRouteSnapshot): boolean {
//         const key = calcKey(route);
//         console.log('CustomReuseStrategy:shouldAttach', key, route);
//         return !!route.routeConfig && !!this.handlers[key];
//     }
//
//     retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
//         if (!route.routeConfig) {
//             return null;
//         }
//         const key = calcKey(route);
//         console.log('CustomReuseStrategy:retrieve', key, route);
//         return this.handlers[calcKey(route)];
//     }
//
//     shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
//         const furtureKey = calcKey(future);
//         const currentKey = calcKey(curr);
//         console.log('CustomReuseStrategy:shouldReuseRoute', furtureKey, currentKey);
//         return furtureKey === currentKey;
//     }
// }
